package utils

import (
	"fmt"
)

// TestStringMatching 测试字符串匹配算法
func TestStringMatching() {
	fmt.Println("=== 字符串模糊匹配测试 ===")

	// 测试用例1：安全生产相关
	fmt.Println("\n测试用例1：安全生产相关")
	target1 := "安全生产管理"
	candidates1 := []string{
		"安全生产管理制度",
		"安全管理规定",
		"生产安全规范",
		"安全生产标准",
		"安全管理制度",
		"生产管理规定",
		"安全生产条例",
	}

	bestMatch1, bestScore1 := FindBestMatch(target1, candidates1)
	fmt.Printf("目标: %s\n", target1)
	fmt.Printf("最佳匹配: %s (相似度: %.3f)\n", bestMatch1, bestScore1)

	allMatches1 := FindBestMatches(target1, candidates1)
	fmt.Println("所有匹配结果（按相似度排序）:")
	for i, match := range allMatches1 {
		fmt.Printf("  %d. %s (相似度: %.3f)\n", i+1, match.Text, match.Score)
	}

	// 测试用例2：消防安全相关
	fmt.Println("\n测试用例2：消防安全相关")
	target2 := "消防安全"
	candidates2 := []string{
		"消防安全管理制度",
		"消防管理规定",
		"消防安全规范",
		"消防设备管理",
		"消防安全检查",
		"消防应急预案",
		"消防安全培训",
	}

	bestMatch2, bestScore2 := FindBestMatch(target2, candidates2)
	fmt.Printf("目标: %s\n", target2)
	fmt.Printf("最佳匹配: %s (相似度: %.3f)\n", bestMatch2, bestScore2)

	allMatches2 := FindBestMatches(target2, candidates2)
	fmt.Println("所有匹配结果（按相似度排序）:")
	for i, match := range allMatches2 {
		fmt.Printf("  %d. %s (相似度: %.3f)\n", i+1, match.Text, match.Score)
	}

	// 测试用例3：完全不同的字符串
	fmt.Println("\n测试用例3：完全不同的字符串")
	target3 := "环境保护"
	candidates3 := []string{
		"安全生产管理",
		"消防安全制度",
		"职业健康安全",
		"环境保护管理",
		"环境监测制度",
		"环境保护规定",
		"环境安全管理",
	}

	bestMatch3, bestScore3 := FindBestMatch(target3, candidates3)
	fmt.Printf("目标: %s\n", target3)
	fmt.Printf("最佳匹配: %s (相似度: %.3f)\n", bestMatch3, bestScore3)

	allMatches3 := FindBestMatches(target3, candidates3)
	fmt.Println("所有匹配结果（按相似度排序）:")
	for i, match := range allMatches3 {
		fmt.Printf("  %d. %s (相似度: %.3f)\n", i+1, match.Text, match.Score)
	}
}

// TestSimilarityCalculation 测试相似度计算
func TestSimilarityCalculation() {
	fmt.Println("\n=== 相似度计算测试 ===")

	testCases := []struct {
		s1, s2 string
		desc   string
	}{
		{"安全生产管理", "安全生产管理制度", "部分匹配"},
		{"安全管理", "安全生产管理", "包含关系"},
		{"生产安全", "安全生产", "顺序不同"},
		{"完全不同的字符串", "另一个完全不同的字符串", "完全不同"},
		{"相同的字符串", "相同的字符串", "完全相同"},
		{"", "", "空字符串"},
		{"短", "很长的字符串", "长度差异很大"},
		{"安全生产", "安全生产", "完全相同"},
		{"安全", "安全生产管理", "子字符串"},
	}

	for _, tc := range testCases {
		similarity := StringSimilarity(tc.s1, tc.s2)
		fmt.Printf("%s: '%s' vs '%s' = %.3f\n", tc.desc, tc.s1, tc.s2, similarity)
	}
}

// TestWithThreshold 测试带阈值的匹配
func TestWithThreshold() {
	fmt.Println("\n=== 带阈值的匹配测试 ===")

	target := "安全管理"
	candidates := []string{
		"安全生产管理制度",
		"安全管理规定",
		"生产安全规范",
		"安全生产标准",
		"安全管理制度",
		"生产管理规定",
		"安全生产条例",
		"职业健康安全管理",
		"消防安全管理",
		"环境安全管理",
		"完全不同的内容",
		"其他不相关的内容",
	}

	thresholds := []float64{0.3, 0.5, 0.7, 0.9}

	for _, threshold := range thresholds {
		fmt.Printf("\n阈值 %.1f 的匹配结果:\n", threshold)
		allMatches := FindBestMatches(target, candidates)
		count := 0
		for _, match := range allMatches {
			if match.Score >= threshold {
				fmt.Printf("  %s (相似度: %.3f)\n", match.Text, match.Score)
				count++
			}
		}
		if count == 0 {
			fmt.Printf("  没有找到相似度 >= %.1f 的匹配\n", threshold)
		}
	}
}

// RunAllTests 运行所有测试
func RunAllTests() {
	TestStringMatching()
	TestSimilarityCalculation()
	TestWithThreshold()
}
